/*******************************************************************************
* Copyright (c) 2000, 2006 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.swt.internal.theme;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.internal.carbon.OS;
import org.eclipse.swt.internal.carbon.CGRect;
import org.eclipse.swt.internal.carbon.HIThemeTextInfo;
public class DrawData {
public int style;
public int[] state;
public Rectangle clientArea;
/** Part states */
public static final int SELECTED = 1 << 1;
public static final int FOCUSED = 1 << 2;
public static final int PRESSED = 1 << 3;
public static final int ACTIVE = 1 << 4;
public static final int DISABLED = 1 << 5;
public static final int HOT = 1 << 6;
public static final int DEFAULTED = 1 << 7;
public static final int GRAYED = 1 << 8;
/** Text and Image drawing flags */
public static final int DRAW_LEFT = 1 << 4;
public static final int DRAW_TOP = 1 << 5;
public static final int DRAW_RIGHT = 1 << 6;
public static final int DRAW_BOTTOM = 1 << 7;
public static final int DRAW_HCENTER = 1 << 8;
public static final int DRAW_VCENTER = 1 << 9;
/** Widget parts */
public static final int WIDGET_NOWHERE = -1;
public static final int WIDGET_WHOLE = 0;
/** Scrollbar parts */
public static final int SCROLLBAR_UP_ARROW = 1;
public static final int SCROLLBAR_DOWN_ARROW = 2;
public static final int SCROLLBAR_LEFT_ARROW = SCROLLBAR_UP_ARROW;
public static final int SCROLLBAR_RIGHT_ARROW = SCROLLBAR_DOWN_ARROW;
public static final int SCROLLBAR_UP_TRACK = 3;
public static final int SCROLLBAR_DOWN_TRACK = 4;
public static final int SCROLLBAR_LEFT_TRACK = SCROLLBAR_UP_TRACK;
public static final int SCROLLBAR_RIGHT_TRACK = SCROLLBAR_DOWN_TRACK;
public static final int SCROLLBAR_THUMB = 5;
/** Scale parts */
public static final int SCALE_UP_TRACK = 1;
public static final int SCALE_LEFT_TRACK = SCALE_UP_TRACK;
public static final int SCALE_DOWN_TRACK = 2;
public static final int SCALE_RIGHT_TRACK = SCALE_DOWN_TRACK;
public static final int SCALE_THUMB = 3;
/** ToolItem parts */
public static final int TOOLITEM_ARROW = 1;
/** Combo parts */
public static final int COMBO_ARROW = 1;
public DrawData() {
state = new int[1];
}
Rectangle computeTrim(Theme theme, GC gc) {
return new Rectangle(clientArea.x, clientArea.y, clientArea.width, clientArea.height);
}
void draw(Theme theme, GC gc, Rectangle bounds) {
}
void drawImage(Theme theme, Image image, GC gc, Rectangle bounds) {
Image drawImage = image;
Rectangle rect = drawImage.getBounds();
int state = this.state[DrawData.WIDGET_WHOLE];
if (OS.VERSION >= 0x1040) {
if ((state & (DrawData.PRESSED | DrawData.DISABLED)) != 0) {
int transform = OS.kHITransformNone;
if ((state & DrawData.DISABLED) != 0) {
transform = OS.kHITransformDisabled;
} else {
if ((state & DrawData.PRESSED) != 0) {
transform = OS.kHITransformSelected;
}
}
if (transform != OS.kHITransformNone) {
int[] buffer = new int[1];
OS.HICreateTransformedCGImage(drawImage.handle, transform, buffer);
if (buffer[0] != 0) {
//TODO - get device
//TODO - is data needed
drawImage = Image.carbon_new(null, drawImage.type, buffer[0], 0);
}
}
}
}
gc.drawImage(drawImage, 0, 0, rect.width, rect.height, bounds.x, bounds.y, bounds.width, bounds.height);
if (drawImage != image) {
drawImage.dispose();
}
}
void drawText(Theme theme, String text, int flags, GC gc, Rectangle bounds) {
int state = this.state[DrawData.WIDGET_WHOLE];
char[] chars = new char[text.length()];
text.getChars(0, chars.length, chars, 0);
int ptr = OS.CFStringCreateWithCharacters(OS.kCFAllocatorDefault, chars, chars.length);
OS.CGContextSaveGState(gc.handle);
if ((state & DrawData.DISABLED) != 0) {
//TODO - find out disable color
OS.CGContextSetFillColor(gc.handle, new float[]{0.5f, 0.5f, 0.5f, 1});
} else {
if ((state & DrawData.ACTIVE) != 0) {
OS.CGContextSetFillColor(gc.handle, new float[]{0, 0, 0, 1});
} else {
//TODO - find out inative color
OS.CGContextSetFillColor(gc.handle, new float[]{0.6f, 0.6f, 0.6f, 1});
}
}
CGRect rect = new CGRect();
rect.x = bounds.x;
rect.y = bounds.y;
rect.width = bounds.width;
rect.height = bounds.height;
HIThemeTextInfo info = getTextInfo(flags);
OS.HIThemeDrawTextBox(ptr, rect, info, gc.handle, OS.kHIThemeOrientationNormal);
OS.CGContextRestoreGState(gc.handle);
OS.CFRelease(ptr);
}
Rectangle getBounds(int part, Rectangle bounds) {
return new Rectangle(bounds.x, bounds.y, bounds.width, bounds.height);
}
int getFontId() {
return OS.kThemeSmallSystemFont;
}
HIThemeTextInfo getTextInfo(int flags) {
int state = this.state[DrawData.WIDGET_WHOLE];
HIThemeTextInfo info = new HIThemeTextInfo();
if ((state & DrawData.PRESSED) != 0) {
info.state = OS.kThemeStatePressed;
} else {
if ((state & DrawData.ACTIVE) != 0) {
info.state = (state & DrawData.DISABLED) == 0 ? OS.kThemeStateActive : OS.kThemeStateUnavailable;
} else {
info.state = (state & DrawData.DISABLED) == 0 ? OS.kThemeStateInactive : OS.kThemeStateUnavailableInactive;
}
}
info.state = info.state;
info.fontID = (short)getFontId();
if ((flags & DrawData.DRAW_LEFT) != 0) info.horizontalFlushness = OS.kHIThemeTextHorizontalFlushLeft;
if ((flags & DrawData.DRAW_HCENTER) != 0) info.horizontalFlushness = OS.kHIThemeTextHorizontalFlushCenter;
if ((flags & DrawData.DRAW_RIGHT) != 0) info.horizontalFlushness = OS.kHIThemeTextHorizontalFlushRight;
if ((flags & DrawData.DRAW_TOP) != 0) info.verticalFlushness = OS.kHIThemeTextVerticalFlushTop;
if ((flags & DrawData.DRAW_VCENTER) != 0) info.verticalFlushness = OS.kHIThemeTextVerticalFlushCenter;
if ((flags & DrawData.DRAW_BOTTOM) != 0) info.verticalFlushness = OS.kHIThemeTextVerticalFlushBottom;
info.truncationMaxLines = 0;
info.truncationPosition = 0;
info.options = 0;
return info;
}
int hit(Theme theme, Point position, Rectangle bounds) {
return -1;
}
Rectangle measureText(Theme theme, String text, int flags, GC gc, Rectangle bounds) {
//TODO - decide if should take only width and return only width/height
char[] chars = new char[text.length()];
text.getChars(0, chars.length, chars, 0);
int ptr = OS.CFStringCreateWithCharacters(OS.kCFAllocatorDefault, chars, chars.length);
int width = bounds != null ? bounds.width : 0;
float[] outWidth = new float[1], outHeight = new float[1];
HIThemeTextInfo info = getTextInfo(flags);
OS.HIThemeGetTextDimensions(ptr, width, info, outWidth, outHeight, null);
OS.CFRelease(ptr);
return new Rectangle(0, 0, (int)outWidth[0], (int)outHeight[0]);
}
}